/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package datos;

import dominio.Asignatura;
import dominio.Horario;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.Time;
import java.util.LinkedList;
import javax.swing.table.DefaultTableModel;

/**
 *
 * @author Richard
 */
public class AsignaturaDatos {

    public AsignaturaDatos() {
    }

    public void ingresarAsignatura(Asignatura asignatura) throws SQLException {
        Connection con = BaseDeDatos.getConexion();
        CallableStatement cs = null;
        try {
            cs = con.prepareCall("{call sproc_ingresar_asignatura(?,?,?,?,?)}");
            cs.setString(1, asignatura.getSigla());
            cs.setString(2, asignatura.getNombre());
            cs.setFloat(3, asignatura.getHorasSemanales());
            cs.setBoolean(4, asignatura.getEsTecnica());
            cs.setInt(5, asignatura.getSubarea().getNivel());
            cs.execute();
        } catch (SQLException e) {
            throw e;
        } finally {
            if (cs != null) {
                try {
                    cs.close();
                } catch (SQLException e) {
                    System.err.println("SQLException: " + e.getMessage());
                }
            }
            if (con != null) {
                try {
                    con.close();
                } catch (SQLException e) {
                    System.err.println("SQLException: " + e.getMessage());
                }
            }
        }
    }//Fin
    
    public void actualizarAsignatura(Asignatura asignatura) throws SQLException {
        Connection con = BaseDeDatos.getConexion();
        CallableStatement cs = null;
        try {
            cs = con.prepareCall("{call sproc_actualizar_asignatura(?,?,?,?,?)}");
            cs.setString(1, asignatura.getSigla());
            cs.setString(2, asignatura.getNombre());
            cs.setFloat(3, asignatura.getHorasSemanales());
            cs.setBoolean(4, asignatura.getEsTecnica());
            cs.setInt(5, asignatura.getSubarea().getNivel());
            cs.execute();
        } catch (SQLException e) {
            throw e;
        } finally {
            if (cs != null) {
                try {
                    cs.close();
                } catch (SQLException e) {
                    System.err.println("SQLException: " + e.getMessage());
                }
            }
            if (con != null) {
                try {
                    con.close();
                } catch (SQLException e) {
                    System.err.println("SQLException: " + e.getMessage());
                }
            }
        }
    }//Fin
    
    public void borrarAsignatura(String sigla) throws SQLException {
        Connection con = BaseDeDatos.getConexion();
        CallableStatement cs = null;
        try {
            cs = con.prepareCall("{call sproc_borrar_asignatura(?)}");
            cs.setString(1, sigla);
            cs.execute();
        } catch (SQLException e) {
            throw e;
        } finally {
            if (cs != null) {
                try {
                    cs.close();
                } catch (SQLException e) {
                    System.err.println("SQLException: " + e.getMessage());
                }
            }
            if (con != null) {
                try {
                    con.close();
                } catch (SQLException e) {
                    System.err.println("SQLException: " + e.getMessage());
                }
            }
        }
    }//Fin

    public DefaultTableModel getAsignaturasAcademicas(String nombre) throws SQLException {
        DefaultTableModel dtmAsignaturasAcademicas = new DefaultTableModel();
        Connection con = null;
        try {
            con = BaseDeDatos.getConexion();
            Statement stmt = con.createStatement();
            String slctAsignaturasAcademicas = "SELECT sigla, nombre, horas_semanales "
                    + "FROM asignatura WHERE es_tecnica=false and nombre like '" + nombre + "%';";
            ResultSet rs = stmt.executeQuery(slctAsignaturasAcademicas);
            dtmAsignaturasAcademicas.addColumn("Sigla");
            dtmAsignaturasAcademicas.addColumn("Nombre");
            dtmAsignaturasAcademicas.addColumn("Horas/semana");
            while (rs.next() == true) {
                dtmAsignaturasAcademicas.addRow(new Object[]{
                    rs.getString(1),
                    rs.getString(2),
                    rs.getFloat(3)});
            }
        } catch (SQLException e) {
            System.err.println("SQLException: " + e.getMessage());
        } finally {
            if (con != null) {
                try {
                    con.close();
                } catch (SQLException e) {
                    System.err.println("SQLException: " + e.getMessage());
                }
            }
        }
        return dtmAsignaturasAcademicas;
    }
    
    public DefaultTableModel getAsignaturasTecnicas(String nombre) throws SQLException {
        DefaultTableModel dtmAsignaturasTecnicas = new DefaultTableModel();
        Connection con = null;
        try {
            con = BaseDeDatos.getConexion();
            Statement stmt = con.createStatement();
            String slctAsignaturasAcademicas = "SELECT a.sigla, a.nombre, a.horas_semanales, s.nivel "
                    + "FROM asignatura a, subarea s WHERE es_tecnica=true and nombre like '" + nombre + "%' "
                    + "and a.sigla=s.sigla;";
            ResultSet rs = stmt.executeQuery(slctAsignaturasAcademicas);
            dtmAsignaturasTecnicas.addColumn("Sigla");
            dtmAsignaturasTecnicas.addColumn("Nombre");
            dtmAsignaturasTecnicas.addColumn("Horas/semana");
            dtmAsignaturasTecnicas.addColumn("Nivel");
            while (rs.next() == true) {
                dtmAsignaturasTecnicas.addRow(new Object[]{
                    rs.getString(1),
                    rs.getString(2),
                    rs.getFloat(3),
                    rs.getInt(4)});
            }
        } catch (SQLException e) {
            System.err.println("SQLException: " + e.getMessage());
        } finally {
            if (con != null) {
                try {
                    con.close();
                } catch (SQLException e) {
                    System.err.println("SQLException: " + e.getMessage());
                }
            }
        }
        return dtmAsignaturasTecnicas;
    }
    
    public DefaultTableModel getEspecialidadesDeSubarea(String sigla) throws SQLException {
        DefaultTableModel dtmEspecialidadesDeSubarea = new DefaultTableModel();
        Connection con = null;
        try {
            con = BaseDeDatos.getConexion();
            Statement stmt = con.createStatement();
            String slctAsignaturasAcademicas = "SELECT e.idEspecialidad,e.nombreEspecialidad "
                    + "FROM asignatura a, subarea s, subarea_especialidad se, especialidad e "
                    + "WHERE a.sigla='"+sigla+"' and a.sigla=s.sigla and s.sigla=se.sigla "
                    + "and se.idEspecialidad=e.idEspecialidad";
            ResultSet rs = stmt.executeQuery(slctAsignaturasAcademicas);
            dtmEspecialidadesDeSubarea.addColumn("idEspecialidad");
            dtmEspecialidadesDeSubarea.addColumn("Especialidades ligadas");
            while (rs.next() == true) {
                dtmEspecialidadesDeSubarea.addRow(new Object[]{
                    rs.getInt(1),
                    rs.getString(2)});
            }
        } catch (SQLException e) {
            System.err.println("SQLException: " + e.getMessage());
        } finally {
            if (con != null) {
                try {
                    con.close();
                } catch (SQLException e) {
                    System.err.println("SQLException: " + e.getMessage());
                }
            }
        }
        return dtmEspecialidadesDeSubarea;
    }
    
    public LinkedList<Asignatura>asignaturasPorTipo() throws SQLException{
    String selectAcademicas="SELECT * FROM asignatura where es_tecnica=false";
    LinkedList<Asignatura>asignaturas=new LinkedList<>();
    Connection conexion=BaseDeDatos.getConexion();
    Statement smt=conexion.createStatement();
    ResultSet rs=smt.executeQuery(selectAcademicas);
    while(rs.next()){
    Asignatura a=new Asignatura();
    a.setSigla(rs.getString(1));
    a.setNombre(rs.getString(2));
    a.setHorasSemanales(rs.getFloat(3));
    a.setEsTecnica(false);
    asignaturas.add(a);
    }
    return asignaturas;
    }
    
    public Asignatura getAsignaturaPorNombre(String nombre) throws SQLException{
    String sqlselect="SELECT * FROM asignatura where nombre=? and es_tecnica=false";
    Connection conexion=BaseDeDatos.getConexion();
    PreparedStatement ps=conexion.prepareCall(sqlselect);
    ps.setString(1, nombre);
    ResultSet rs=ps.executeQuery();
    Asignatura a=new Asignatura();
    while(rs.next()){
    a.setSigla(rs.getString(1));
    a.setNombre(rs.getString(2));
    a.setHorasSemanales(rs.getFloat(3));
    a.setEsTecnica(false);
    }
    return a;
    }
    
    public LinkedList<Asignatura> asignaturasPorEspecialidad(String nombreEspecialidad) throws SQLException {
        LinkedList<Asignatura>asignaturas=new LinkedList<>();
        Connection con = BaseDeDatos.getConexion();
        CallableStatement cs = con.prepareCall("{call sproc_obtiene_asignaturas_por_especialidad(?)}");
        cs.setString(1,nombreEspecialidad);
        ResultSet rs=cs.executeQuery();
        while(rs.next()){
        Asignatura a=new Asignatura();
        a.setSigla(rs.getString("a.sigla"));
        a.setNombre(rs.getString("a.nombre"));
        a.setHorasSemanales(rs.getFloat("a.horas_semanales"));
        a.setEsTecnica(true);
        asignaturas.add(a);
        }
        return asignaturas;
    }
    
      public Asignatura getAsignaturaPorNombreTecnico(String nombre) throws SQLException{
    String sqlselect="SELECT * FROM asignatura where nombre=? and es_tecnica=true";
    Connection conexion=BaseDeDatos.getConexion();
    PreparedStatement ps=conexion.prepareCall(sqlselect);
    ps.setString(1, nombre);
    ResultSet rs=ps.executeQuery();
    Asignatura a=new Asignatura();
    while(rs.next()){
    a.setSigla(rs.getString(1));
    a.setNombre(rs.getString(2));
    a.setHorasSemanales(rs.getFloat(3));
    a.setEsTecnica(false);
    }
    return a;
    }
}
